package Aleehot100;

import java.util.Arrays;

/**
 * ClassName: c015
 * Package: Aleehot100
 * Description:
 *
 * @Author BCXJ
 * @Create 2025/5/27 08:58
 * @Version 1.0
 * @Since 1.0
 */
public class c015 {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4};
        rotate2(arr, 3);
        System.out.println(Arrays.toString(arr));
    }

    /**
     * 轮转数组 ， 这个的解法我看不懂，使用翻转数组吧
     * @param nums
     * @param k
     */
    public static void rotate(int[] nums, int k) {
        int n = nums.length;
        k = k % n;
        int index, pre = 0, cur;
        // 虽然是双重for，但是时间复杂度为O(n)
        for (int i = 0; i < k; i++) {

        }
    }


    /**
     * 反转数组的技巧
     * @param nums
     * @param k
     */
    public static void rotate2(int[] nums, int k) {
        int n = nums.length;
        // 整体反转一遍
        reverse(nums, 0, n - 1);

        // [0 ~ (k % n) - 1]
        reverse(nums, 0, (k % n) - 1);

        // [k % n, n - 1]
        reverse(nums, k % n, n - 1);
    }


    public static void reverse(int[] arr, int i, int j) {
        int l = i, r = j;
        while(l < r) {
            swap(arr, l, r);
            r --;
            l ++;
        }
    }

    private static void swap(int[] arr, int l, int r) {
        if(l == r) {
            return;
        }
        arr[l] = arr[l] ^ arr[r];
        arr[r] = arr[l] ^ arr[r];
        arr[l] = arr[l] ^ arr[r];
    }


}
